مشخصات مقاله
-
2055
-
0.0
-
11128
-
0
-
0
آموزش کار با پایگاه داده در Laravel
شروع کار با پایگاه داده
- مقدمه
-
اجرای Query های خالص SQL
- گوش دادن به رخدادهای Query با متد Listen
- تراکنش های پایگاه داده
- استفاده ی همزمان از چندین connection در پروژه
مقدمه
در Laravel به راحتی می توان با پایگاه داده اتصال برقرار کرده و به وسیله ی SQL خالص یا کوئری ساز لاراول (fluent query builder) و یا ابزارORM Eloquent از پایگاه داده های سمت سرور (back-end database) کوئری گرفت. در حال حاضر لاراول از چهار پایگاه داده ی زیر پشتیبانی می کند:
- MySQL
- Postgres
- SQLite
- SQL Server
تنظیمات
همان طور که در بالا نیز به آن اشاره شد، Laravel اتصال به پایگاه داده و فرایند اجرای کوئری را به طور قابل توجهی آسان می سازد. تنظیمات مربوط به پایگاه داده اپلیکیشن به صورت پیش فرض در فایل config/database.php قرار دارد. در این فایل می توانید تمامی connection ها به پایگاه داده خود را تعریف کرده و نیز مشخص کنید کدام connection به عنوان پیش فرض برای اتصال به پایگاه داده مورد استفاده قرار گیرد. نمونه های متعددی برای هر یک از سیستم های بانک اطلاعاتی مزبور در این فایل لحاظ شده است.
به صورت پیش فرض، لاراول یک environment connection به عنوان نمونه ارائه می دهد که کاملا آماده ی بهره برداری و استفاده همراه باHomestead می باشد. Homestead یک ماشین مجازی کارآمد برای توسعه اپلیکیشن های لاراول بر روی دستگاه شخصی برنامه نویس است. البته این امکان به شما داده شده که تنظیمات پیش فرض را مطابق نیاز پایگاه داده ی برنامه خود ویرایش نمایید.
تنظیمات SQLite
پس از اینکه پایگاه داده ی SQLite را با فراخوانی دستور touch database/database.sqlite ایجاد کردید، می توانید به راحتی متغیرهای محیطی (environment variable) را طوری تنظیم کنید که به پایگاه داده ی جدید اشاره کند. برای این منظور لازم است مسیر مطلق پایگاه داده (absolute path) را ارائه دهید:
DB_CONNECTION=sqlite DB_DATABASE=/absolute/path/to/database.sqlite
تنظیمات SQL Server
Laravel به طور آماده و بدون نیاز به هیچگونه تنظیماتی از بانک اطلاعاتی SQL Server پشتیبانی می کند. تنها کاری که باید انجام دهید، افزودن تنظیمات پایگاه داده می باشد:
'sqlsrv' => [
'driver' => 'sqlsrv',
'host' => env('DB_HOST', 'localhost'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
],
connection برای خواندن / نوشتن
گاهی ممکن است بخواهید از یک connection برای اجرای دستورات SELECT و از دیگری برای انجام عملیات INSERT، UPDATE وDELETE بهره بگیرید. Laravel این کار را بسیار سهل ساخته و نیز با توجه به نوع کوئری همیشه از connection مناسب برای اتصال به پایگاه داده و گرفتن کوئری از آن بهره می گیرد (در واقع برای ارتباط با بانک اطلاعاتی و پرس و جو از آن همیشه مطابق با نوع کوئری (SQL خالص، Query Builder یا Eloquent ORM) از connection مناسب و مربوطه استفاده می کند).
برای آشنایی با نحوه ی تنظیم connection های از نوع read / write به مثال زیر دقت نمایید:
'mysql' => [
'read' => [
'host' => '192.168.1.1',
],
'write' => [
'host' => '196.168.1.2'
],
'driver' => 'mysql',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
],
همان طور که می بینید دو کلید به آرایه ی تنظیمات اضافه شده است: read و write. هر دو کلید ذکر شده خود حاوی تنها یک مقدار به نام hostهستند. باقی گزینه ها و آپشن های کانکشن read و write از مقدار تعریف شده در آرایه ی mysql (که دیگر آرایه ها در آن تعریف شده اند) گرفته خواهد شد.
اگر می خواهید مقادیر موجود در آرایه mysql را بازنویسی کنید، کافی است آیتم ها را در آرایه های read و write قرار دهید. بنابراین مقدار 192.168.1.1 برای اتصال از نوع read بکار می رود در حالی که مقدار 192.168.1.2 برای اتصال از نوع write استفاده می شود.database credentials (رمزعبور و نام کاربری پایگاه داده)، prefix، character set (مجموعه کاراکتر) و تمامی دیگر گزینه های این دوconnection همگی مقادیر خود را از آرایه ی اصلی mysql به اشتراک می گیرند.
اجرای Query های خالص SQL
پس از اینکه connection به پایگاه داده را تنظیم کردید، با بهره گیری از DB facade می توانید کوئری های مورد نظر را اجرا کنید. facade نام برده به ازای هر نوع کوئری یک متد ارائه می دهد: select، update، insert، delete و statement.
اجرای کوئری Select
برای اجرای یک کوئری ساده، می توان متد select را در DB facade فراخونی کرد:
<?php
namespace App\Http\Controllers;
use DB;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* Show a list of all of the application's users.
*
* @return Response
*/
public function index()
{
$users = DB::select('select * from users where active = ?', [1]);
return view('user.index', ['users' => $users]);
}
}
اولین آرگومان پاس داده شده به متد select یک کوئری خالص SQL است، در حالی که آرگومان دوم یک پارامتر ارسالی است (یک parameter binding هست) که باید به کوئری bind شود. به طور معمول این پارامترهای ارسالی همان مقادیر محدودیت های (constraint) عبارت whereهستند. ارسال پارامتر (parameter binding) در مقابله با حمله ی SQL Injection بسیار مفید واقع می شود.
متد select همیشه آرایه ای از سطرها را به عنوان خروجی برمی گرداند. هر المان در آرایه ی یک شی PHP StdClass خواهد بود. این اشیا به شما اجازه می دهند به راحتی به مقادیر نتایج دسترسی داشته باشید:
foreach ($users as $user) {
echo $user->name;
}
ارسال پارامتر نام گذاری شده (named bindings)
می توانید بجای اینکه که از علامت ? به نشانه پارامتر ارسالی (پارامتری که باید bind شود) استفاده کنید، آن پارامتر را با نامش به متد select پاس داده و سپس کوئری را اجرا نمایید:
$results = DB::select('select * from users where id = :id', ['id' => 1]);
اجرای دستور Insert
جهت اجرای دستور insert، کافی است متد insert را در DB facade فراخوانی کنید. مانند دستور select، این متد کوئری خالص SQL را به عنوان اولین آرگومان پذیرفته و پارامترهایی که باید bind شوند (پارامتر ورودی) را به عنوان آرگومان دوم می پذیرد:
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
اجرای دستور update
متد update را می توان به منظور بروز آوری رکوردهای موجود در پایگاه داده مورد استفاده قرار داد. تعداد سطرهایی که توسط متد مذکور بروز رسانی می شوند، در خروجی برگردانده می شود:
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
اجرای دستور Delete
متد delete را می توان برای حذف رکوردها از پایگاه داده مورد استفاده قرار داد. درست مانند update، تعداد سطرهای حذف شده در خروجی برگردانده می شود:
$deleted = DB::delete('delete from users');
متد statement
تمامی دستورات که بر روی پایگاه داده اجرا می شود لزومی ندارد خروجی برگرداند. برای این نوع عملیات، می توان دستور statement را در DB facade صدا زد:
DB::statement('drop table users');
گوش دادن به رخدادهای Query با متد Listen
می توانید با بهره گیری از متد listen در façade DB، برای تمامی کوئری ها listener تعریف کنید. متد ذکر شده به شما کمک می کند از کوئری هاlog گرفته و آن ها را عیب یابی کنید. می توانید query listener را در یک service provider ثبت کنید:
<?php
namespace App\Providers;
use DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
DB::listen(function ($query) {
// $query->sql
// $query->bindings
// $query->time
});
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}
تراکنش های پایگاه داده
به منظور اجرای مجموعه ای از علملیات طی یک تراکنش بر روی پایگاه داده، Laravel متد transaction را ارائه می دهد. در صورتی که در طول اجرای تابع Closure متد transaction خطا رخ دهد، تراکنش به صورت خودکار به حالت قبلی برگردانده می شود (rollback). و اگر با موفقیت اجرا شد، تراکنش به صورت خودکار تایید ثبت (commit) می گردد.
به هنگام استفاده از متد transaction لزومی ندارد نگران بازگرداندن یا تایید ثبت تراکنش به صورت دستی باشید:
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
راه اندازی و اجرای تراکنش ها به صورت دستی
اگر می خواهید یک تراکنش را به صورت دستی اجرا کرده و کنترل کامل بر عملیات rollback (بازگشت تراکنش به حالت قبلی) و commit (تایید ثبت تراکنش)، می توانید متد begin Transaction را بر روی DB facade فراخوانی نمایید:
DB::beginTransaction();
می توانید تراکنش را به وسیله ی متد rollback به حالت قبلی برگردانید (به عقب برگردانید):
DB::rollBack();
در پایان می توانید تراکنش را به وسیله ی متد commit تایید ثبت نمایید:
DB::commit();
متدهای مربوط به تراکنش façade DB همچنین در تراکنش های query builder و Eloquent ORM کاربرد دارد (می توان از آن ها برای کنترل تراکنش های query builder و Eloquent استفاده کرد).
استفاده همزمان از چندین connection در پروژه
هنگامی که چندین connection (برای انجام عملیات مختلف) در پروژه خود تعریف شده دارید، می توانید از طریق متد connection در façade DB به هر یک از connection ها دسترسی داشته باشید. name ای که به متد connection ارسال می کنید باید با یکی از connection های لیست شده در فایل تنظیمات config/database.php منطبق باشد:
$users = DB::connection('foo')->select(...);
همچنین می توانید به نمونه ی شی PDO خالص و زیرساختی دسترسی داشته باشید. برای این منظور کافی است متد getPdo را بر روی نمونه ای ازconnection صدا بزنید:
$pdo = DB::connection()->getPdo();